XML 轻松读取:用 Python 发现数据宝藏
本文作者:许林丽 中南财经政法大学统计与数学学院
本文编辑:何疆
技术总编:王玉婷
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~1、什么是 XML
XML 是一种用于表示结构化数据的文本文件格式。它被广泛应用于数据交换和存储,尤其在互联网和 Web 应用中。XML 的设计目标是传输和存储数据,使其易于阅读、理解和解析。它使用自定义标签来定义数据的结构和层次关系,类似于 HTML。然而,与 HTML 不同,XML 不是用于显示数据的样式和布局,而是强调数据的含义和结构。
XML 文件由一系列标签组成,每个标签包含一个元素,可以包含文本内容、属性和子元素。例如:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>张伟</name>
<age>30</age>
<email>zhangwei@example.com</email>
</person>
在上面的示例中,第一行是 XML 声明,定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 可显示各种语言)。person 是一个顶级元素,它包含了 name、age 和email 三个子元素,每个子元素都包含相应的文本内容。
XML 文件可以通过各种编程语言和工具进行解析和处理。开发人员可以使用 XML 解析器读取 XML 文件,并根据标签和结构提取所需的数据。此外,XML 还支持 DTD(Document Type Definition)和 XML Schema 等机制,用于定义和验证 XML 文档的结构和规范。
首先,小编创建了一个记录有学生姓名、学号和语数英三科成绩的 XML 格式文件,并保存名为 “students” 的 XML 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<class>
<student>
<name>张三</name>
<id>10001</id>
<grades>
<subject>语文</subject>
<grade>95</grade>
</grades>
<grades>
<subject>数学</subject>
<grade>90</grade>
</grades>
<grades>
<subject>英语</subject>
<grade>85</grade>
</grades>
</student>
<student>
<name>李四</name>
<id>10002</id>
<grades>
<subject>语文</subject>
<grade>85</grade>
</grades>
<grades>
<subject>数学</subject>
<grade>80</grade>
</grades>
<grades>
<subject>英语</subject>
<grade>90</grade>
</grades>
</student>
<student>
<name>王五</name>
<id>10003</id>
<grades>
<subject>语文</subject>
<grade>80</grade>
</grades>
<grades>
<subject>数学</subject>
<grade>100</grade>
</grades>
<grades>
<subject>英语</subject>
<grade>90</grade>
</grades>
</student>
</class>
接下来,本文小编将介绍如何使用 Python 读取上面的 XML 文件。
2、利用 Python 读取 XML 文件
(1)使用xml.etree.ElementTree模块
xml.etree.ElementTree 是 Python 标准库中的一个模块,提供了简单而高效的 API 来处理 XML 数据。使用该方法读取 XML 文件的代码如下:
# 导入 ElementTree 模块
import xml.etree.ElementTree as ET
# 加载 XML 文件
tree = ET.parse('students.xml')
root = tree.getroot()
# 遍历学生节点
for student in root.findall('student'):
# 获取学生姓名和学号
name = student.find('name').text
id = student.find('id').text
print(f"学生姓名:{name}")
print(f"学生学号:{id}")
# 遍历成绩节点
for grades in student.findall('grades'):
subject = grades.find('subject').text
grade = grades.find('grade').text
print(f"科目:{subject}")
print(f"成绩:{grade}")
print() # 输出文件内容
运行以上代码将输出每个学生的姓名、学号以及各科目的成绩,输出结果如下:
(2)使用xml.dom.minidom模块
# 导入 minidom 模块
import xml.dom.minidom as minidom
# 加载 XML 文件
doc = minidom.parse('students.xml')
# 获取根节点
root = doc.documentElement
# 遍历学生节点
students = doc.getElementsByTagName('student')
for student in students:
# 获取学生姓名和学号
name = student.getElementsByTagName('name')[0].firstChild.data
id = student.getElementsByTagName('id')[0].firstChild.data
print(f"学生姓名:{name}")
print(f"学生学号:{id}")
# 遍历成绩节点
grades = student.getElementsByTagName('grades')
for grade in grades:
subject =grade.getElementsByTagName('subject')[0].firstChild.data
grade_value = grade.getElementsByTagName('grade')[0].firstChild.data
print(f"科目:{subject}")
print(f"成绩:{grade_value}")
print() #输出文件内容
运行以上代码,输出结果如下:
(3)使用lxml模块
lxml是一个基于 C 的高性能 XML 解析库,提供了简单而强大的 API 来处理 XML 数据。使用该方法读取 XML 文件的代码如下:
# 导入 lxml 模块
from lxml import etree
# 加载 XML 文件
tree = etree.parse('students.xml')
root = tree.getroot()
# 遍历学生节点
for student in root.findall('student'):
# 获取学生姓名和学号
name = student.find('name').text
id = student.find('id').text
print(f"学生姓名:{name}")
print(f"学生学号:{id}")
# 遍历成绩节点
for grades in student.findall('grades'):
subject = grades.find('subject').text
grade = grades.find('grade').text
print(f"科目:{subject}")
print(f"成绩:{grade}")
print() # 输出文件内容
运行以上代码,输出结果如下:
以上是使用 Python 读取 XML 格式文件的三种方法的介绍,它们都提供了加载 XML 文件、访问节点、获取节点文本内容等常见操作的功能,都具有良好的性能和易用性,具体选择哪种方法取决于个人的需求和偏好。
END
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
爬虫俱乐部重磅推出cnstata.com.cn
Markdown:让数学公式输入更方便!
处理日期的好手:pendulumWhat’ new ? 速通Stata 18
【爬虫实战】Python爬取美食菜谱揭秘网络中心人物,你会是其中之一吗?考研之后,文科生需以“do”躬“do”!焕新升级!轻松获取港股、权证的历史交易数据爬虫俱乐部的精彩答疑---cntraveltime【爬虫俱乐部新命令速递】在Stata中与ChatGPT对话用`fs`命令批量获取文件夹和不同文件夹下的excel文件
自然语言处理之实例应用JSON帮手,FeHelper
最新、最热门的命令这里都有!
Python实现微信自动回复告诉python,我想“狂飙”了——线程池与异步协程为爬虫提速 关于我们微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。